package com.luntan.dao;

import com.luntan.util.web.Page;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 数据库言访问层接口
 *
 * @author MaShiQiong
 * @date 2016-11-14 14:14:27
 * @param <T>
 * @param <K>
 */
public interface BaseDAO<T, K extends Serializable> {

    /**
     * 加载实体
     */
    public T loadEntity(Class<T> clasz, K id) throws Exception;

    /**
     * 加载实体
     */
    public T getEntity(Class<T> clasz, K id) throws Exception;

    /**
     * 通过查询语句来获取实体对象
     */
    public T getEntity(String hsql) throws Exception;

    /**
     * 删除实体
     */
    public void removeEntity(T obj) throws Exception;

    /**
     * 删除实体集合
     */
    public void removeAllEntity(Collection<T> obj) throws Exception;

    /**
     * 保存实体
     */
    public T saveEntity(T t) throws Exception;

    /**
     * 保存临时实体
     */
    public T saveTempEntity(T t) throws Exception;

    /**
     * 更新实体
     */
    public T updateEntity(T t) throws Exception;

    /**
     * 根据hql语句更新
     */
    public void updateEntity(String hql) throws Exception;

    /**
     * 添加或保存实体
     */
    public T saveOrUpdate(T obj) throws Exception;

    /**
     * 添加或保存实体集合
     */
    public void saveOrUpdateColl(Collection<T> co) throws Exception;

    /**
     * 通过hql语句查找实体集合
     */
    public List<T> findEntity(String hql, Object[] obj) throws Exception;

    /**
     * 通过hql语句查找实体集合
     */
    public List<T> findEntity(String hql) throws Exception;

    /**
     * 通过hql语句查找实体集合
     */
    public List<T> findEntity(String hql, Object obj) throws Exception;

    /**
     * 根据hql查询 返回Object集合
     */
    public List<Object> findList(String hql) throws Exception;

    /**
     * 根据hql查询 返回Object集合
     */
    public List<Object> findList(String hql, Object obj) throws Exception;

    /**
     * 根据hql查询 返回Object
     */
    public List<Object> findList(String hql, Object[] obj) throws Exception;

    /**
     * 根据hql查询 返回Object数组
     */
    public List<Object[]> findListArray(String hql) throws Exception;

    /**
     * 根据hql查询 返回Object数组
     */
    public List<Object[]> findListArray(String hql, int start, int limit)
            throws Exception;

    /**
     * 通过hql语句查找实体集合
     */
    public List<T> findEntity(String hql, int start, int limit) throws Exception;

    /**
     * 根据sql语句执行
     */
    public void executeSQL(String sql) throws Exception;

    /**
     * 根据sql语句查询
     */
    public List<Map<String, Object>> findListBySql(final String sql) throws Exception;

    /**
     * 分页查询
     */
    public Page<T> search(String hql, int page, int limit) throws Exception;

    /**
     * 获取底层的数据连接对象
     *
     * @return
     * @throws SQLException
     */
    public Connection getConnection() throws SQLException;
}